package com.loong.android.tools;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

/**
 * 哈希表，用于快速存储数据
 */
public class HashMap {
    private final Map<String, Object> map = new java.util.HashMap<>();

    public Map<String, Object> getMap() {
        return map;
    }

    /**
     * 添加数据
     * @param key 名称，若已存在相同名称的数据，则替换该数据
     * @param data 任意类型的数据
     */
    public <T> HashMap addData(String key, T data) {
        map.put(key, data);
        return this;
    }

    /**
     * 获取数据
     * @param key 名称
     * @return 返回存储的数据，并自动转换为对应的数据类型。对应名称的数据不存在时，返回null
     */
    public <T> T getData(String key) {
        return (T) map.get(key);
    }

    /**
     * 清除所有数据
     */
    public void clear() {
        map.clear();
    }

    /**
     * 删除数据
     * @param key 名称
     * @return 返回被删除的数据
     */
    public <T> T remove(String key) {
        return (T) map.remove(key);
    }

    /**
     * 判断是否包含某个数据的名称
     * @param key 名称
     */
    public boolean containsKey(String key) {
        return map.containsKey(key);
    }

    /**
     * 判断是否包含某个数据
     * @param value 数据
     */
    public boolean containsValue(Object value) {
        return map.containsValue(value);
    }

    /**
     * 获取数据总数
     */
    public int size() {
        return map.size();
    }

    /**
     * 是否为空，没有任何数据
     */
    public boolean isEmpty() {
        return map.isEmpty();
    }

    /**
     * 遍历得到所有数据的名称
     */
    public String[] listKeys() {
        Iterator<Map.Entry<String, Object>> iterator = map.entrySet().iterator();
        Map.Entry<String, Object> entry;
        List<String> output = new ArrayList<>();
        while (iterator.hasNext()){
            entry = iterator.next();
            output.add(entry.getKey());
        }
        return output.toArray(new String[output.size()]);
    }

    /**
     * 遍历得到所有的名称和数据数组，存在Item类中。
     */
    public Item[] list() {
        Iterator<Map.Entry<String, Object>> iterator = map.entrySet().iterator();
        Map.Entry<String, Object> entry;
        List<Item> output = new ArrayList<>();
        while (iterator.hasNext()){
            entry = iterator.next();
            output.add(new Item(entry.getKey(), entry.getValue()));
        }
        return output.toArray(new Item[output.size()]);
    }

    /**
     * 遍历时存储名称和数据的类
     */
    public static class Item {
        //名称
        public String key;
        //数据
        public Object value;

        public Item() {

        }

        public Item(String key, Object value) {
            this.key = key;
            this.value = value;
        }

    }

}
